package banco;

import java.util.Date;
import java.util.Random;
import java.util.Scanner;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import banco.BancoDados;
import banco.ContaCorrente;
import banco.Operacoes;

public class guiFuncionario {
	
	public guiFuncionario () {
	}
	
	public Funcionario login(String user, String senha, BancoDados dadosSistema) {
		Funcionario funcionarioLogado = new Funcionario();
		Funcionario percorreLista = new Funcionario();
		for(int i = 0; i<dadosSistema.funcionarios.size(); i++)
		{
			percorreLista = dadosSistema.funcionarios.get(i);
			
			if(percorreLista.user!=null) {
				if(percorreLista.user.equals(user)) {
					if(percorreLista.senha.equals(senha)) {
						funcionarioLogado = percorreLista;
					}
				}
			}
		}
		return funcionarioLogado;
	}
	
	public boolean fazDeposito(int conta, int agencia, float valor, int envelope, BancoDados dadosSistema) {
		float saldoAtualizado;
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaEncontrada = new ContaCorrente();
		Date data = new Date();
		boolean semErros = false;
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == conta) {
					contaEncontrada = percorreLista;
				}
		}
		
		if(contaEncontrada.numero != -1) {
				Deposito novoDeposito = new Deposito(envelope, data, valor, agencia, conta, true, true);
				contaEncontrada.adicionaDeposito(novoDeposito);
				saldoAtualizado = contaEncontrada.getSaldo() + valor;
				contaEncontrada.setSaldo(saldoAtualizado);
				System.out.println("Dep�sito realizado com sucesso.\nSeu novo saldo �:" + saldoAtualizado + "\n");
				semErros = true;
		}
		return semErros;
	}
	
	public boolean fazSaque(int agencia, int conta, float valor, BancoDados dadosSistema) {
		float saldoAtualizado;
		boolean semErros = false;
		Date data = new Date();
		Imposto imposto = new Imposto();
		float valor_imposto;
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaEncontrada = new ContaCorrente();
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == conta) {
					contaEncontrada = percorreLista;
				}
		}
		
		if(contaEncontrada.numero != -1) {
			valor_imposto = imposto.calculaImposto(valor);
			
			if(contaEncontrada.getSaldo() > valor + valor_imposto) {
				Saque novoSaque = new Saque(data, valor, agencia, conta);
				contaEncontrada.adicionaSaque(novoSaque);
				
				saldoAtualizado = contaEncontrada.getSaldo() - valor - valor_imposto;
				contaEncontrada.setSaldo(saldoAtualizado);
				System.out.println("Saque realizado com sucesso.\nSeu novo saldo �:" + saldoAtualizado + "\n");
				System.out.println("Valor CPMF �:" + valor_imposto + "\n");
				semErros = true;
			}
		}
		return semErros;
	}
	
	public boolean fazTransferencia(int agenciaOrigem, int agenciaDestino, int contaOrigem, int contaDestino, float valor, BancoDados dadosSistema)	{
		float novoSaldoOrigem;
		float novoSaldoDestino;
		boolean semErros = false;
		Date data = new Date();
		Imposto imposto = new Imposto();
		float valor_imposto;
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaDestinoEncontrada = new ContaCorrente();
		ContaCorrente contaOrigemEncontrada = new ContaCorrente();
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == contaDestino) {
					contaDestinoEncontrada = percorreLista;
				}
		}
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == contaOrigem) {
					contaOrigemEncontrada = percorreLista;
				}
		}
		
		if((contaOrigemEncontrada.numero != -1) && (contaDestinoEncontrada.numero != -1)) {
			valor_imposto = imposto.calculaImposto(valor);
			
			if(contaOrigemEncontrada.getSaldo() > valor + valor_imposto) {
				Transferencia novaTransf = new Transferencia(data, valor, agenciaOrigem, agenciaDestino, contaOrigem, contaDestino);
				contaOrigemEncontrada.adicionaTransferencia(novaTransf);
				contaDestinoEncontrada.adicionaTransferencia(novaTransf);
				
				
				novoSaldoOrigem = contaOrigemEncontrada.getSaldo() - valor - valor_imposto;
				novoSaldoDestino = contaDestinoEncontrada.getSaldo() + valor;
				
				contaOrigemEncontrada.setSaldo(novoSaldoOrigem);
				contaDestinoEncontrada.setSaldo(novoSaldoDestino);
				System.out.println("Transfer�ncia realizada com sucesso.\nSeu novo saldo �:" + novoSaldoOrigem + "\n");
				System.out.println("Valor CPMF �:" + valor_imposto + "\n");
				semErros = true;
			}
		}
		return semErros;
	}
	
	public boolean efetuaPagamento(int agenciaOrigem, int agenciaDestino, int contaOrigem, int contaDestino, 
			String dataVencimento, float valor, float multaPagamento, BancoDados dadosSistema) throws ParseException {
			
		float novoSaldoOrigem;
		float novoSaldoDestino;
		boolean semErros = false;
		Imposto imposto = new Imposto();
		float valor_imposto;
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaDestinoEncontrada = new ContaCorrente();
		ContaCorrente contaOrigemEncontrada = new ContaCorrente();
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == contaDestino) {
					contaDestinoEncontrada = percorreLista;
				}
		}
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == contaOrigem) {
					contaOrigemEncontrada = percorreLista;
				}
		}
		
		if((contaOrigemEncontrada.numero != -1) && (contaDestinoEncontrada.numero != -1)) {
			
			Date dataMulta = new SimpleDateFormat("ddMMyyyy").parse(dataVencimento);
			Date dataAtual = new Date();
			
			float valorComMulta = valor;
			if (dataAtual.after(dataMulta)){
				valorComMulta += valor * (multaPagamento / 100); 
			}
				
			valor_imposto = imposto.calculaImposto(valorComMulta);
			if(contaOrigemEncontrada.getSaldo() > valorComMulta + valor_imposto) {
				Pagamento novoPagamOrigem = new Pagamento(dataAtual, dataMulta, valor, valorComMulta, multaPagamento, agenciaOrigem, agenciaDestino, contaOrigem, contaDestino);
				Pagamento novoPagamDestino = new Pagamento(dataAtual, dataMulta, valor, valorComMulta, multaPagamento, agenciaOrigem, agenciaDestino, contaOrigem, contaDestino);			
				contaOrigemEncontrada.adicionaPagamento(novoPagamOrigem);
				contaDestinoEncontrada.adicionaPagamento(novoPagamDestino);
				
				novoSaldoOrigem = contaOrigemEncontrada.getSaldo() - valorComMulta - valor_imposto;
				novoSaldoDestino = contaDestinoEncontrada.getSaldo() + valorComMulta;
				
				contaOrigemEncontrada.setSaldo(novoSaldoOrigem);
				contaDestinoEncontrada.setSaldo(novoSaldoDestino);
				System.out.println("Transfer�ncia realizada com sucesso.\nSeu novo saldo �:" + novoSaldoOrigem + "\n");
				System.out.println("Valor CPMF �:" + valor_imposto + "\n");
				semErros = true;
			}
		}
		return semErros;
	}
	
	public boolean imprimeSaldo(int conta, BancoDados dadosSistema) {
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaEncontrada = new ContaCorrente();
		boolean semErros = false;
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == conta) {
					contaEncontrada = percorreLista;
				}
		}
		
		if(contaEncontrada.numero != -1) {
			Date dataAtual = new Date();
			String dataAtualFormatada = new SimpleDateFormat("dd/MM/yyyy '�s' HH:mm:ss").format(dataAtual);
			System.out.println("O saldo da sua conta �: " + contaEncontrada.getSaldo());
			System.out.println("\nConsulta realizada em " + dataAtualFormatada);
			semErros = true;
		}
		return semErros;
	}
	
	public boolean imprimeExtrato(int conta, BancoDados dadosSistema) {
		ContaCorrente percorreListaContas = new ContaCorrente();
		ContaCorrente contaEncontrada = new ContaCorrente();
		Operacoes percorreListaOps = new Operacoes();
		Scanner controleInput = new Scanner(System.in);
		int controleOpcao;
		Date dataAtual = new Date();
		String dataFormatadaMes = new SimpleDateFormat("MM").format(dataAtual);
		int mes = Integer.parseInt(dataFormatadaMes);
		String dataFormatadaAno = new SimpleDateFormat("yyyy").format(dataAtual);
		int ano = Integer.parseInt(dataFormatadaAno);
		boolean semErros = true;
		String diaInicio = "";
		String mesInicio = "";
		String anoInicio = "";
		String[] dataInicio = null;
		String dataFim = "";
		String mesDeposito;
		String anoDeposito;
		String dataDeposito;
		String mesSaque;
		String anoSaque;
		String dataSaque;
		String mesTransferencia;
		String anoTransferencia;
		String dataTransferencia;
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreListaContas = dadosSistema.contas.get(i);
			
			if(percorreListaContas.numero == conta) {
					contaEncontrada = percorreListaContas;
				}
		}
		
		if(contaEncontrada.numero != -1) {
			System.out.println("Selecione o tipo de extrato a ser emitido:\n");
			System.out.println("1 - M�s anterior\n2 - Per�odo personalizado\n");
			controleOpcao = controleInput.nextInt();
			
			switch (controleOpcao) {
			case 1:
				System.out.println("Escolha o m�s:\n");
				int controleMes = mes;
				int controleAno = ano;
				for(int i=1; i<7; i++) {
					System.out.println(i + " - " + controleMes + "/" + controleAno + "\n");
					if(controleMes>1) {
						controleMes--;
					} else {
						controleMes += 11;
						controleAno--;
					}
				}
				controleOpcao = controleInput.nextInt();
				switch (controleOpcao) {
				case 1:
					controleMes = mes;
					controleAno = ano;
					break;
				case 2:
					if(mes>1) {
						controleMes = mes-1;
						controleAno = ano;
					}
					else {
						controleMes = mes+11;
						controleAno = ano-1;
					}
					break;
				case 3:
					if(mes>2) {
						controleMes = mes-2;
						controleAno = ano;
					}
					else {
						controleMes = mes+10;
						controleAno = ano-1;
					}
					break;
				case 4:
					if(mes>3) {
						controleMes = mes-3;
						controleAno = ano;
					}
					else {
						controleMes = mes+9;
						controleAno = ano-1;
					}
					break;
				case 5:
					if(mes>4) {
						controleMes = mes-4;
						controleAno = ano;
					}
					else {
						controleMes = mes+8;
						controleAno = ano-1;
					}
					break;
				case 6:
					if(mes>5) {
						controleMes = mes-5;
						controleAno = ano;
					}
					else {
						controleMes = mes+7;
						controleAno = ano-1;
					}
					break;
				default:
					System.out.println("Op��o inexistente.\n");
					semErros = false;
					break;
				}
				if(semErros) {
					System.out.println("Extrato:\n");
					for(int i = 0; i<contaEncontrada.operacoes.size(); i++)
					{
						percorreListaOps = contaEncontrada.operacoes.get(i);
	
						if(percorreListaOps.deposito != null) {
							mesDeposito = new SimpleDateFormat("MM").format(percorreListaOps.deposito.data);
							int mesDepositoInt = Integer.parseInt(mesDeposito);
							anoDeposito = new SimpleDateFormat("yyyy").format(percorreListaOps.deposito.data);
							int anoDepositoInt = Integer.parseInt(anoDeposito);
							dataDeposito = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.deposito.data);
							
							if((mesDepositoInt==controleMes) && (anoDepositoInt==controleAno)) {
								System.out.println(i + " - Dep�sito: " + percorreListaOps.deposito.valor + " em " + dataDeposito + "\n");
							}
						} else if(percorreListaOps.saque != null) {
							mesSaque = new SimpleDateFormat("MM").format(percorreListaOps.saque.data);
							int mesSaqueInt = Integer.parseInt(mesSaque);
							anoSaque = new SimpleDateFormat("yyyy").format(percorreListaOps.saque.data);
							int anoSaqueInt = Integer.parseInt(anoSaque);
							dataSaque = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.saque.data);
							
							if((mesSaqueInt==controleMes) && (anoSaqueInt==controleAno)) {
								System.out.println(i + " - Saque: " + percorreListaOps.saque.valor + " em " + dataSaque + "\n");
							}
						} else if (percorreListaOps.transferencia != null) {
							mesTransferencia = new SimpleDateFormat("MM").format(percorreListaOps.transferencia.data);
							int mesTransferenciaInt = Integer.parseInt(mesTransferencia);
							anoTransferencia = new SimpleDateFormat("yyyy").format(percorreListaOps.transferencia.data);
							int anoTransferenciaInt = Integer.parseInt(anoTransferencia);
							dataTransferencia = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.transferencia.data);
							
							if((mesTransferenciaInt==controleMes) && (anoTransferenciaInt==controleAno)) {
								System.out.println(i + " - Transferencia: " + percorreListaOps.transferencia.valor + " em " + dataTransferencia + "\n");
							}
						}
					}
				}
				break;
			case 2:
				System.out.println("Escolha a data inicial do per�odo no formato dd/mm/aaaa:\n");
				String dataInicioBruta = controleInput.next();
				if(dataInicioBruta.equals("")) {
				} else {
					dataInicio = dataInicioBruta.split("/");
				}
				System.out.println("Escolha a data final do per�odo no formato dd/mm/aaaa:\n");
				String dataFimBruta = controleInput.next();
				if(dataFimBruta.equals("")) {
				} else {
					int k = 0;
					while((!mesInicio.equals(dataInicio[1])) && (!anoInicio.endsWith(dataInicio[2])) && (!diaInicio.equals(dataInicio[0])) && k<contaEncontrada.operacoes.size()){

						percorreListaOps = contaEncontrada.operacoes.get(k);
						
						if(percorreListaOps.deposito != null) {
							diaInicio = new SimpleDateFormat("dd").format(percorreListaOps.deposito.data);
							mesInicio = new SimpleDateFormat("MM").format(percorreListaOps.deposito.data);
							anoInicio = new SimpleDateFormat("yyyy").format(percorreListaOps.deposito.data);
						} else if (percorreListaOps.transferencia != null) {
							diaInicio = new SimpleDateFormat("dd").format(percorreListaOps.transferencia.data);
							mesInicio = new SimpleDateFormat("MM").format(percorreListaOps.transferencia.data);
							anoInicio = new SimpleDateFormat("yyyy").format(percorreListaOps.transferencia.data);
						} else if (percorreListaOps.saque != null) {
							diaInicio = new SimpleDateFormat("dd").format(percorreListaOps.saque.data);
							mesInicio = new SimpleDateFormat("MM").format(percorreListaOps.saque.data);
							anoInicio = new SimpleDateFormat("yyyy").format(percorreListaOps.saque.data);
						}
						k++;
					}
					int j = 1;
					while((!dataFim.equals(dataFimBruta)) && k<contaEncontrada.operacoes.size()) {
						percorreListaOps = contaEncontrada.operacoes.get(k);
						
						if(percorreListaOps.deposito != null) {
							dataDeposito = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.deposito.data);
							dataFim = dataDeposito;
							System.out.println(j + " - Dep�sito: " + percorreListaOps.deposito.valor + " em " + dataDeposito + "\n");
						} else if(percorreListaOps.saque != null) {
							dataSaque = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.saque.data);
							dataFim = dataSaque;
							System.out.println(j + " - Saque: " + percorreListaOps.saque.valor + " em " + dataSaque + "\n");
						} else if (percorreListaOps.transferencia != null) {
							dataTransferencia = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.transferencia.data);
							dataFim = dataTransferencia;
							System.out.println(j + " - Transferencia: " + percorreListaOps.transferencia.valor + " em " + dataTransferencia + "\n");
						}
						j++;
						k++;
					}
				}
				break;
			default:
				System.out.println("Op��o inv�lida.\n");
				semErros = false;
				break;
			}
		}
		controleInput.close();
		return semErros;
	}
	
	public ContaCorrente criaConta(int agencia, double cpf, float valor, BancoDados dadosSistema) {
		int nroContas = dadosSistema.contas.size();
		ContaCorrente contaTeste = new ContaCorrente();
		Agencia percorreListaAgencias = new Agencia();
		Agencia agenciaEquivalente = new Agencia();
		Cliente percorreListaCliente = new Cliente();
		Cliente clienteEncontrado = new Cliente();
		Random senhaAleatoria = new Random();
		
		for(int i = 0; i<dadosSistema.agencias.size(); i++)
		{
			percorreListaAgencias = dadosSistema.agencias.get(i);
			
			if(percorreListaAgencias.numero == agencia) {
					agenciaEquivalente = percorreListaAgencias;
				}
		}
		for(int i = 0; i<dadosSistema.clientes.size(); i++)
		{
			percorreListaCliente = dadosSistema.clientes.get(i);
			
			if(percorreListaCliente.cpf == cpf) {
					clienteEncontrado = percorreListaCliente;
				}
		}
		if(clienteEncontrado.cpf != 0) {
			ContaCorrente novaConta = new ContaCorrente(valor, nroContas, agenciaEquivalente);
			clienteEncontrado.setConta(novaConta);
			String senha = Integer.toString(senhaAleatoria.nextInt(10000));
			clienteEncontrado.setSenha(senha);
			contaTeste = novaConta;
			dadosSistema.contas.add(novaConta);
			System.out.println("Conta criada com sucesso.\n");
			System.out.println("Numero: " + nroContas + "\nSenha: " + senha + "\n");
		}
		return contaTeste;
	}
	
	public Funcionario logout(BancoDados dadosSistema) {
		return dadosSistema.funcionarios.get(0);
	}

}
